package factory;

import java.util.concurrent.DelayQueue;
import java.util.concurrent.Executors;
import java.util.concurrent.LinkedBlockingQueue;
import java.util.concurrent.SynchronousQueue;
import java.util.concurrent.ThreadPoolExecutor;
import java.util.concurrent.TimeUnit;

import util.MessageUtil;

/**
 * 单例模式线程池  (贼屌！南日自创类)
 * 自此所有子线程将由此类支配！
 * @author Administrator
 *
 */
public final class PoolFactoryManager {

	private static PoolFactoryManager pool = null;
	
	 // 线程池维护线程的最少数量
    private static final int SIZE_CORE_POOL = 15;

    // 线程池维护线程的最大数量
    private static final int SIZE_MAX_POOL = Integer.MAX_VALUE;
    
    static{
    	pool = new PoolFactoryManager();
    }
    
    /**
     * 线程池
     * @param corePoolSize - 基础线程数。
     * @param maximumPoolSize - 最大线程数。
     * @param keepAliveTime - 当线程数大于SIZE_CORE_POOL时，终止线程等待时间数。
     * @param unit - keepAliveTime 参数的时间单位。
     * @param workQueue - 执行前用于保持任务的队列。此队列仅由保持 execute 方法提交的 Runnable 任务。
     * @param handler - 由于超出线程范围和队列容量而使执行被阻塞时所使用的处理程序。
     */
    private final ThreadPoolExecutor mThreadPool = new ThreadPoolExecutor(SIZE_CORE_POOL, SIZE_MAX_POOL, 60L,TimeUnit.SECONDS, new LinkedBlockingQueue<Runnable>());
    
    /**
     * 构造函数私有化
     */
    private PoolFactoryManager(){	
    }
    
    /**
     * 返回线程池对象
     * @return
     */
    public static PoolFactoryManager newInstance(){
    	return pool;
    }
    
    /**
     * 往线程池添加任务
     * @param task
     */
    public void addExecuteTask(Runnable task) {
        if (task != null) {
            mThreadPool.execute(task);
        }
    }
    
    /**
     * 获取缓存大小
     */
    public int getQueue(){
        return mThreadPool.getQueue().size();
    }
    
    /**
     * 获取线程池中的线程数目
     */
    public int getPoolSize(){
        return mThreadPool.getPoolSize();
    }
    
    /**
     * 获取已完成的任务数
     */
    public long getCompletedTaskCount(){
        return mThreadPool.getCompletedTaskCount();
    }
    
    public String getPoolMsg(){
    	return "线程池缓存大小" + String.valueOf(mThreadPool.getQueue().size())+
    			"线程项目" + String.valueOf(mThreadPool.getPoolSize())+
    			"已完成任务" + String.valueOf(mThreadPool.getCompletedTaskCount());
    			
    }
    
    public static void main(String[] args) {
    	
		
	}
}
